package main

import (
	"fmt"
	"strings"
)

// 1 求 n 的阶乘。 至少使用递归函数完成一次。
func fact(n int) int {
	if n == 0 {
		return 1
	} else if n < 0 {
		panic("n is negative")
	} else if n == 1 {
		return n * fact(n-1)
	}
	return n * fact(n-1)
}

// 2 编写一个函数， 接受一个参数 n ， n 为正整数。 要求数字必须对齐
func alig(n int) {
	for i := 0; i < n; i++ {
		c := 12 - n
		if n <= 8 {
			fmt.Printf("%v   ", strings.Repeat("  ", c))
		} else {
			fmt.Printf("%v", strings.Repeat("   ", c))
		}
		for r := n; r > i; r-- {
			fmt.Printf("%d ", r)
			n--
		}
		fmt.Println()
	}
}
func main() {
	for i := 0; i < 15; i++ {
		fmt.Println(fact(i))
	}
	for i := 1; i < 13; i++ {
		alig(i)
	}
	//3、 简述 defer 作用和应用
	//推迟执行，当有多个defer的时候后进先出原则，一般函数执行，要么正常退出return，要么异常结束panic，都可以保证这2种情况下，defer才会执行。注册时计算
	// 常用于文件打开后的关闭，网络连接后断开，锁获得后释放

}
